home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / wbgames / krsnake / src / graphic.e < prev    next >
Text File  |  1996-04-07  |  5KB  |  179 lines

  1.  
  2. OPT MODULE
  3.  
  4. MODULE 'graphics/gfx','datatypes','datatypes/datatypes','datatypes/pictureclass',
  5.        'datatypes/datatypesclass','intuition/screens','amigalib/boopsi',
  6.        'graphics/view','utility/tagitem','graphics/rastport','graphics/scale',
  7.        'exec/memory','hardware/blit','tools/file'
  8.  
  9. EXPORT OBJECT graphic
  10.     w,h,dt,type
  11. PRIVATE
  12.     bm[20]:ARRAY OF LONG
  13.     mask[20]:ARRAY OF LONG
  14. ENDOBJECT
  15.  
  16. ENUM TYPE_ERROR,TYPE_SNAKE,TYPE_FRUIT
  17.  
  18. PROC patchGraphic(name:PTR TO CHAR,screen:PTR TO screen) -> Aaaaargh! a KLUDGE!!
  19.     DEF dri:PTR TO drawinfo,f=0,l,c[3]:ARRAY OF LONG,p,s=FALSE,r,g,b
  20.     f,l:=readfile(name,NIL)
  21.     p:=f
  22.     IF Long(p)<>"FORM" THEN Raise("grld")
  23.     p:=p+8
  24.     IF Long(p)<>"ILBM" THEN Raise("grld")
  25.     p:=p+4
  26.     WHILE p<(f+l)
  27.         IF Long(p)="CMAP"
  28.             dri:=GetScreenDrawInfo(screen)
  29.             GetRGB32(screen.viewport.colormap,dri.pens[BACKGROUNDPEN],1,c)
  30.             FreeScreenDrawInfo(screen,dri)
  31.             r:=Char(c)
  32.             g:=Char(c+4)
  33.             b:=Char(c+8)
  34.             IF (r<>Char(p+8)) OR (g<>Char(p+9)) OR (b<>Char(p+10))
  35.                 PutChar(p+8,r)
  36.                 PutChar(p+9,g)
  37.                 PutChar(p+10,b)
  38.                 s:=TRUE
  39.             ENDIF
  40.         ENDIF
  41.         p:=p+Long(p+4)+8
  42.     ENDWHILE
  43.     IF s THEN writefile(name,f,l)
  44.     freefile(f)
  45. ENDPROC
  46.  
  47. EXPORT PROC loadGraphic(name:PTR TO CHAR,screen:PTR TO screen) HANDLE
  48.     DEF g:PTR TO graphic,pat[1024]:ARRAY OF CHAR
  49.  
  50.     IF name=0 THEN RETURN 0
  51.     IF Char(name)=0 THEN RETURN 0
  52.     patchGraphic(name,screen)
  53.     NEW g
  54.     g.dt:=NewDTObjectA(name,[DTA_GROUPID,GID_PICTURE,PDTA_REMAP,TRUE,
  55.                              PDTA_SCREEN,screen,
  56.                              PDTA_FREESOURCEBITMAP,FALSE,
  57.                              OBP_PRECISION,PRECISION_EXACT,TAG_DONE])
  58.     IF g.dt<>0
  59.         IF doMethodA(g.dt,[DTM_PROCLAYOUT,NIL,1])=0 THEN Raise("grld")
  60.     ELSE
  61.         Raise("grld")
  62.     ENDIF
  63.  
  64.     g.type:=TYPE_ERROR
  65.     ParsePatternNoCase('#?.s#?',pat,1024)
  66.     IF MatchPatternNoCase(pat,name) THEN g.type:=TYPE_SNAKE
  67.     ParsePatternNoCase('#?.f#?',pat,1024)
  68.     IF MatchPatternNoCase(pat,name) THEN g.type:=TYPE_FRUIT
  69.     IF g.type=TYPE_ERROR THEN Raise("grld")
  70.  
  71. EXCEPT
  72.     IF g
  73.         IF g.dt THEN DisposeDTObject(g.dt)
  74.         END g
  75.     ENDIF
  76.     ReThrow()
  77. ENDPROC g
  78.  
  79. EXPORT PROC freeGraphic(g:PTR TO graphic)
  80.     DEF i
  81.     IF g=0 THEN RETURN
  82.     FOR i:=0 TO 13
  83.         IF g.bm[i] THEN FreeBitMap(g.bm[i])
  84.         IF g.mask[i] THEN Dispose(g.mask[i])
  85.     ENDFOR
  86.     DisposeDTObject(g.dt)
  87.     END g
  88. ENDPROC
  89.  
  90. EXPORT PROC drawGraphic(rp,g:PTR TO graphic,i,x,y)
  91.     IF g.mask[i]
  92.         BltMaskBitMapRastPort(g.bm[i],0,0,rp,x,y,g.w,g.h,ABC OR ABNC OR ANBC,g.mask[i])
  93.     ELSE
  94.         BltBitMapRastPort(g.bm[i],0,0,rp,x,y,g.w,g.h,$C0)
  95.     ENDIF
  96. ENDPROC
  97.  
  98. EXPORT PROC scaleGraphic(g:PTR TO graphic,w,h,screen:PTR TO screen) HANDLE
  99.     DEF bmhd:PTR TO bitmapheader,bm:PTR TO bitmap,rw,rh,sa:PTR TO bitscaleargs,i,m
  100.  
  101.     IF (w=g.w) AND (h=g.h) THEN RETURN
  102.  
  103.     m:=IF g.type=TYPE_FRUIT THEN 0 ELSE 19
  104.  
  105.     FOR i:=0 TO 19
  106.         IF g.bm[i] THEN FreeBitMap(g.bm[i])
  107.         IF g.mask[i] THEN Dispose(g.mask[i])
  108.     ENDFOR
  109.     GetDTAttrsA(g.dt,[PDTA_BITMAPHEADER,{bmhd},PDTA_DESTBITMAP,{bm},TAG_DONE])
  110.     IF bm
  111.         g.w:=w
  112.         g.h:=h
  113.         rw:=bmhd.width
  114.         rh:=bmhd.height/(m+1)
  115.         IF (rh*(m+1))<>bmhd.height THEN Raise("size")
  116.         i:=0
  117.         NEW sa
  118.         FOR i:=0 TO m
  119.             g.bm[i]:=AllocBitMap(w,h,GetBitMapAttr(bm,BMA_DEPTH),0,screen.rastport.bitmap)
  120.             IF g.bm[i]
  121.                 IF (w<>rw) OR (h<>rh)
  122.                     sa.srcx:=0
  123.                     sa.srcwidth:=rw
  124.                     sa.srcheight:=rh
  125.                     sa.destx:=0
  126.                     sa.desty:=0
  127.                     sa.srcbitmap:=bm
  128.                     sa.xsrcfactor:=rw
  129.                     sa.xdestfactor:=w
  130.                     sa.ysrcfactor:=rh
  131.                     sa.ydestfactor:=h
  132.                     sa.destbitmap:=g.bm[i]
  133.                     sa.srcy:=i*rh
  134.                     BitMapScale(sa)
  135.                 ELSE
  136.                     BltBitMap(bm,0,i*rh,g.bm[i],0,0,rw,rh,$C0,$FF,NIL)
  137.                 ENDIF
  138.                 g.mask[i]:=createMask(g.bm[i],w,h)
  139.             ELSE
  140.                 Raise("MEM")
  141.             ENDIF
  142.         ENDFOR
  143.     ELSE
  144.         Raise("grbm")
  145.     ENDIF
  146. EXCEPT DO
  147.     END sa
  148.     IF exception THEN ReThrow()
  149. ENDPROC
  150.  
  151. PROC createMask(bm:PTR TO bitmap,w,h) HANDLE -> KLUDGE! Gfxlib ought to support bitmaps as masks! :(
  152.     DEF mbm:bitmap,i,j,mask=0:PTR TO CHAR,bs,p:PTR TO CHAR,m
  153.  
  154.     mbm.flags:=BMF_STANDARD
  155.     mbm.bytesperrow:=bm.bytesperrow
  156.     mbm.rows:=bm.rows
  157.     mbm.depth:=bm.depth
  158.     bs:=mbm.bytesperrow*mbm.rows
  159.     FOR i:=0 TO (mbm.depth-1) DO mbm.planes[i]:=0
  160.     FOR i:=0 TO (mbm.depth-1) DO mbm.planes[i]:=NewM(bs,MEMF_CHIP OR MEMF_CLEAR)
  161.     BltBitMap(bm,0,0,mbm,0,0,w,h,$C0,$FF,NIL)
  162.     mask:=NewM(bs,MEMF_CHIP OR MEMF_CLEAR)
  163.     FOR i:=0 TO (bs-1)
  164.         m:=0
  165.         FOR j:=0 TO (mbm.depth-1)
  166.             p:=mbm.planes[j]
  167.             m:=Or(m,p[i])
  168.         ENDFOR
  169.         mask[i]:=m
  170.     ENDFOR
  171. EXCEPT DO
  172.     FOR i:=0 TO (mbm.depth-1) DO IF mbm.planes[i] THEN Dispose(mbm.planes[i])
  173.     IF exception
  174.         IF mask THEN Dispose(mask)
  175.         ReThrow()
  176.     ENDIF
  177. ENDPROC mask
  178.  
  179.